O dataset utilizado apresenta um apanhado de ocorrências de recalls em veículos, disponibilizada pela National Highway Traffic Safety Administration (NHTSA).
Recall é um termo usado em diversos contextos, mas geralmente se refere a uma ação de correção ou retirada de um produto ou serviço que apresentou problemas de segurança ou eficácia. Um recall de veículos é uma ação corretiva realizada pela fabricante de um automóvel devido a problemas identificados com alguma peça ou componente do veículo. Esse tipo de recall é feito para corrigir questões de segurança ou de funcionamento do veículo antes que elas possam causar problemas para os proprietários ou para outros usuários da estrada. Em geral, o proprietário do veículo é notificado pela fabricante sobre o recall e pode levar o veículo para ser consertado em uma concessionária autorizada sem custo algum.
A NHTSA, que em português significa Administração Nacional de Segurança de Tráfego Rodoviário, é uma agência do departamento de transporte dos Estados Unidos responsável por regulamentar e garantir a segurança de veículos e equipamentos relacionados à segurança viária, incluindo regulamentação de normas para veículos, equipamentos de segurança, e a investigação de acidentes de trânsito. A NHTSA também é responsável por monitorar e realizar recalls de veículos quando necessário, a fim de garantir a segurança dos usuários da estrada.
Obtenção, estrutura e limpeza dos dados
Os dados foram obtidos diretamente do site da NHTSA. Na seção de recalls é disponibilizado o arquivo FLAT_RCL.zip que contém um arquivo .txt que foi utilizado como dataset.
Existe uma versão deste arquivo no formato csv e com os dados tratados. Porém, esta fonte de dados não será utilizada, pois não possui informações detalhadas dos modelo dos veículos.
import plotly.express as pximport plotly.graph_objects as goimport plotly.offline as pyoimport seaborn as snsimport matplotlib.pyplot as pltfrom plotly.subplots import make_subplotsimport numpy as npimport pandas as pdfrom datetime import datefrom wordcloud import WordCloudimport requests# from google.colab import filesimport seaborn as snspyo.init_notebook_mode()RECALLS_DATASET_COLUMNS = ['RECORD_ID', 'CAMPNO', 'MAKETXT', 'MODELTXT', 'YEARTXT','MFGCAMPNO', 'COMPNAME', 'MFGNAME', 'BGMAN', 'ENDMAN','RCLTYPECD', 'POTAFF', 'ODATE', 'INFLUENCED_BY','MFGTXT', 'RCDATE', 'DATEA', 'RPNO', 'FMVSS','DESC_DEFECT','CONEQUENCE_DEFECT', 'CORRECTIVE_ACTION', 'NOTES','RCL_CMPT_ID', 'MFR_COMP_NAME', 'MFR_COMP_DESC', 'MFR_COMP_PTNO']# from google.colab import drive# drive.mount('/content/drive')# df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/data/FLAT_RCL.txt', sep='\t', names=RECALLS_DATASET_COLUMNS, on_bad_lines='warn')df = pd.read_csv('./FLAT_RCL.txt', sep='\t', names=RECALLS_DATASET_COLUMNS, on_bad_lines='warn')
b'Skipping line 188430: expected 27 fields, saw 34\n'
/var/folders/xd/8z39lbd16x7982mr0x9w49h80000gn/T/ipykernel_9017/1140024500.py:29: DtypeWarning:
Columns (17,18,24,25,26) have mixed types. Specify dtype option on import or set low_memory=False.
Após importado, o dataset é apresentado conforme o modelo seguinte:
Code
df.head(5)
RECORD_ID
CAMPNO
MAKETXT
MODELTXT
YEARTXT
MFGCAMPNO
COMPNAME
MFGNAME
BGMAN
ENDMAN
...
RPNO
FMVSS
DESC_DEFECT
CONEQUENCE_DEFECT
CORRECTIVE_ACTION
NOTES
RCL_CMPT_ID
MFR_COMP_NAME
MFR_COMP_DESC
MFR_COMP_PTNO
0
1
02V288000
FORD
FOCUS
2000
02S41
ELECTRICAL SYSTEM:12V/24V/48V BATTERY:CABLES
FORD MOTOR COMPANY
19990719.0
20010531.0
...
NaN
NaN
CERTAIN PASSENGER VEHICLES EQUIPPED WITH ZETEC...
THIS, IN TURN, COULD CAUSE THE BATTERY CABLES ...
DEALERS WILL INSPECT THE BATTERY CABLES FOR TH...
ALSO CONTACT THE NATIONAL HIGHWAY TRAFFIC SAFE...
000015339000215021000000202
NaN
NaN
NaN
1
2
02V288000
FORD
FOCUS
2001
02S41
ELECTRICAL SYSTEM:12V/24V/48V BATTERY:CABLES
FORD MOTOR COMPANY
19990719.0
20010531.0
...
NaN
NaN
CERTAIN PASSENGER VEHICLES EQUIPPED WITH ZETEC...
THIS, IN TURN, COULD CAUSE THE BATTERY CABLES ...
DEALERS WILL INSPECT THE BATTERY CABLES FOR TH...
ALSO CONTACT THE NATIONAL HIGHWAY TRAFFIC SAFE...
000015339000215022000000202
NaN
NaN
NaN
2
3
02V236000
JAYCO
FT EAGLE 10 SG
2003
NaN
EQUIPMENT:OTHER:LABELS
JAYCO, INC.
20020730.0
20020813.0
...
NaN
NaN
ON CERTAIN FOLDING TENT CAMPERS, THE FEDERAL C...
IF THE TIRES WERE INFLATED TO 80 PSI, THEY COU...
OWNERS WILL BE MAILED CORRECT LABELS FOR INSTA...
ALSO, CUSTOMERS CAN CONTACT THE NATIONAL HIGHW...
000015210000106403000000349
NaN
NaN
NaN
3
4
02V237000
HOLIDAY RAMBLER
ENDEAVOR
2000
NaN
STRUCTURE
MONACO COACH CORP.
NaN
NaN
...
NaN
NaN
ON CERTAIN CLASS A MOTOR HOMES, THE FLOOR TRUS...
CONDITIONS CAN RESULT IN THE BOTTOMING OUT THE...
DEALERS WILL INSPECT THE FLOOR TRUSS NETWORK S...
CUSTOMERS CAN ALSO CONTACT THE NATIONAL HIGHWA...
000015211000083965000000272
NaN
NaN
NaN
4
5
02V237000
HOLIDAY RAMBLER
ENDEAVOR
1999
NaN
STRUCTURE
MONACO COACH CORP.
NaN
NaN
...
NaN
NaN
ON CERTAIN CLASS A MOTOR HOMES, THE FLOOR TRUS...
CONDITIONS CAN RESULT IN THE BOTTOMING OUT THE...
DEALERS WILL INSPECT THE FLOOR TRUSS NETWORK S...
CUSTOMERS CAN ALSO CONTACT THE NATIONAL HIGHWA...
000015211000080938000000272
NaN
NaN
NaN
5 rows × 27 columns
Renomeando e selecionando colunas
O dataset possui um grande conjunto de colunas para a descrição dos recalls, porém, essa análise será realizada apenas sobre um subconjunto dos dados do dataset. Features como descrição e correção do recall não foram consideradas nesta análise.
Assim, a análise será focada nas colunas conforme dados e tipos detalhados abaixo:
Variable
Type/Size
Definitions
CAMPNO
CHAR(12)
NHTSA CAMPAIGN NUMBER
MAKETXT
CHAR(25)
VEHICLE/EQUIPMENT MAKE
MODELTXT
CHAR(256)
VEHICLE/EQUIPMENT MODEL
YEARTXT
CHAR(4)
MODEL YEAR, 9999 IF UNKNOWN or N/A
COMPNAME
CHAR(256)
COMPONENT DESCRIPTION
RCLTYPECD
CHAR(4)
VEHICLE, EQUIPMENT OR TIRE REPORT
POTAFF
NUMBER(9)
POTENTIAL NUMBER OF UNITS AFFECTED
MFGTXT
CHAR(40)
MANUFACTURERS OF RECALLED VEHICLES/PRODUCTS
RCDATE
CHAR(8)
REPORT RECEIVED DATE
CONEQUENCE_DEFECT
CHAR(2000)
CONSEQUENCE SUMMARY
De forma a facilitar a compreensão e acesso aos dados, as colunas selecionadas, foram também renomeadas.
Após renomeadas e filtradas, o dataset é apresentado como apresentado abaixo:
Code
df.head(5)
RECALL_ID
VEHICLE_MAKE
VEHICLE_MODEL
VEHICLE_YEAR
COMPONENT_NAME
RECALL_TYPE_CODE
AFFECTED_UNITS
MANUFACTURER
REPORTED_DATE
0
02V288000
FORD
FOCUS
2000
ELECTRICAL SYSTEM:12V/24V/48V BATTERY:CABLES
V
291854.0
Ford Motor Company
20021106
1
02V288000
FORD
FOCUS
2001
ELECTRICAL SYSTEM:12V/24V/48V BATTERY:CABLES
V
291854.0
Ford Motor Company
20021106
2
02V236000
JAYCO
FT EAGLE 10 SG
2003
EQUIPMENT:OTHER:LABELS
V
86.0
Jayco, Inc.
20020904
3
02V237000
HOLIDAY RAMBLER
ENDEAVOR
2000
STRUCTURE
V
6223.0
MONACO COACH CORPORATION
20020909
4
02V237000
HOLIDAY RAMBLER
ENDEAVOR
1999
STRUCTURE
V
6223.0
MONACO COACH CORPORATION
20020909
Recall ID
Um recall possui um identificador único, que segue um padrão específico. Assim, a fim de seguir com dados válidos, podemos remover recalls em que o ID não segue o padrão definido pela NHTSA.
/var/folders/xd/8z39lbd16x7982mr0x9w49h80000gn/T/ipykernel_9017/2931764268.py:5: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Tipos de Recalls
O dataset categoriza os recalls em alguns grupos, a partir de códigos de tipos de recall (coluna RECALL_TYPE_CODE).
Recalls do tipo E, T, X e C não estão a um recall de uma marca de veículo, mas de uma marca de equipamento (E), pneu (T e X) ou assento para criança (C).
Apenas os recalls do tipo V e I serão analisados, pois ambos os tipos informam o modelo do veículo. Recalls de outros tipos serão desconsiderados.
Mesmo após filtrados, os recalls nessas categorias de componente ainda representam cerca de 90% das entradas originais do dataset.
Code
percentual_recalls_veiculos = df[df['RECALL_TYPE_CODE'].isin(['V', 'I'])]['RECALL_TYPE_CODE'].count() / df['RECALL_TYPE_CODE'].count()print("Percentual de recalls do tipo veículo: %.2f%%"% (percentual_recalls_veiculos *100))
Percentual de recalls do tipo veículo: 91.70%
Code
df = df[df['RECALL_TYPE_CODE'].isin(['V', 'I'])]
Modelos de veículos
As colunas VEHICLE_MAKE e VEHICLE_MODEL apresentam, respectivamente, a montadora e modelo de veículos envolvidos no recall. Assim, as colunas foram concatenadas e utilizados para identificar um veículo no dataset.
Podemos verificar por anos de modelo inválidos no dataset. Alguns modelos possuem ano 9999, este valor é utilizado para quando o ano do modelo é desconhecido. Registros com ano de veículo desconhecido foram removidos.
No dataset a data do recall é apresentada como texto, sem formatação específica para ser convertida e categorizada por datas, sendo apresentado no seguinte formato:
Os componentes possuem nome separado por ‘:’ com informações adicionais sobre o componente. Podemos extrair apenas o conteúdo principal do nome do componente.
0 ELECTRICAL SYSTEM
1 ELECTRICAL SYSTEM
2 EQUIPMENT
3 STRUCTURE
4 STRUCTURE
Name: COMPONENT_NAME, dtype: object
Alguns componentes possuem um nome diferente para um tipo de componente que já existe no dataset, e podem ser renomeados de forma a melhor agrupar os dados.
Code
DUPLICATED_COMPONENTS_TYPE = {'OTHER': 'UNKNOWN OR OTHER', 'TBD': 'UNKNOWN OR OTHER','Tether, Lower Anchor (on car seat or vehicle)': 'SEAT BELTS'}
Existe uma grande variedade de componentes para os quais os recalls foram registrados. Como o nível de detalhamento era muito grande, foi optado por agrupá-los em categorias, de forma a ter um conjunto maior de recalls em um nível de detalhamento um pouco menor, facilitando a análise dos dados quando olhando para os grupos de dados.
Code
def get_component_category(component):if component in ['SEAT BELTS', 'AIR BAGS', 'FORWARD COLLISION AVOIDANCE', 'VEHICLE SPEED CONTROL', 'ELECTRONIC STABILITY CONTROL', 'LANE DEPARTURE']:return'SECURITY'elif component in ['ENGINE', 'ENGINE AND ENGINE COOLING', 'POWER TRAIN', 'TRACTION CONTROL SYSTEM', 'HYBRID PROPULSION SYSTEM']:return'ENGINE'elif component in ['SERVICE BRAKES', 'SERVICE BRAKES, ELECTRIC', 'SERVICE BRAKES, AIR', 'SERVICE BRAKES, HYDRAULIC', 'PARKING BRAKE']:return'BRAKE'elif component in ['FUEL SYSTEM, DIESEL', 'FUEL SYSTEM, GASOLINE', 'FUEL SYSTEM, OTHER']:return'FUEL'elif component in ['ELECTRICAL SYSTEM', 'INTERIOR LIGHTING']:return'ELECTRICAL'elif component in ['STRUCTURE', 'SEATS', 'SUSPENSION', 'LATCHES/LOCKS/LINKAGES', 'STEERING', 'WHEELS', 'TIRES']:return'STRUCTURAL'elif component in ['TRAILER HITCHES', 'CHILD SEAT', 'EQUIPMENT', 'COMMUNICATION', 'BACK OVER PREVENTION', 'EQUIPMENT ADAPTIVE/MOBILITY']:return'ACCESSORIES'elif component in ['VISIBILITY', 'VISIBILITY/WIPER', 'EXTERIOR LIGHTING']:return'VISIBILITY'elif component in ['UNKNOWN OR OTHER']:return'OTHER'else:print('Component without category:', component)return component
No dataset existem nomes do mesmo fabricante com formas de escritas diferentes (case sensitive). Para evitar duplicações, o nome dos fabricantes foi padronizado em upper case.
Code
df['MANUFACTURER'].head()
0 Ford Motor Company
1 Ford Motor Company
2 Jayco, Inc.
3 MONACO COACH CORPORATION
4 MONACO COACH CORPORATION
Name: MANUFACTURER, dtype: object
0 FORD MOTOR COMPANY
1 FORD MOTOR COMPANY
2 JAYCO, INC.
3 MONACO COACH CORPORATION
4 MONACO COACH CORPORATION
Name: MANUFACTURER, dtype: object
Unidades afetadas pelo recall
Alguns recalls possuem NA no valor de unidades afetadas. Podemos preencher esse valor com a mediana de unidades afetadas por componente de cada fabricante.
A coluna CONSEQUENCE_SUMMARY detalha as possíveis consequências do problema relatado para recall. Elas não possuem padronização quanto ao uso de letras maíusculas e minúsculas. Assim, para uma melhor análise, o texto das descrições foi padronizado com o uso de letras minúsculas.
A partir do dashboard desenvolvido, foi possível explorar principalmente a relação entre o número de recalls e número de veículos afetados por recalls, definindo filtros quanto ao período de tempo, fabricante e modelo para exploração.
Algumas análises e insights obtidos a partir da exploração do dashboard construído são apresentadas em seguida.
Números de ocorrências de recalls
Média de número de recalls e veículos afetados por recalls
Quais afetaram mais (muito acima da media)
Qual era o tipo desses recalls que estão muito acima da média
Quais componentes mais comuns em ocorrências de recalls
Code
from wordcloud import WordCloudfrom wordcloud import ImageColorGeneratorfrom wordcloud import STOPWORDStext =" ".join(str(i) for i in df_consequence['CONSEQUENCE_SUMMARY'])stopwords =set(STOPWORDS)wordcloud = WordCloud(width=800, height=400, stopwords=stopwords, background_color="white").generate(text)plt.figure(figsize=(15,10))plt.imshow(wordcloud, interpolation='bilinear')plt.axis("off")plt.show()
num_recalls = df_2022['RECALL_ID'].nunique()print(f'Number of unique recalls: {num_recalls}')# affected_models = df[['VEHICLE_MODEL', 'VEHICLE_YEAR']].drop_duplicates().shape[0]# print(f'Number of vehicle models: {affected_models}')# df_affected_units = df[['RECALL_ID','AFFECTED_UNITS']].drop_duplicates()# affected_units = df_affected_units['AFFECTED_UNITS'].sum()# print(f'Number of affected units: {affected_units/1000000}MM')
Number of unique recalls: 932
No ano de 2022 ocorreram 932 recalls em 4113 modelos de veículos. Mais de 30 milhões de unidades foram afetadas por recalls, um aumento de aproximadamente 7% em relação a 2021.
Dashboard Initial Page
O fabricante com maior número de recalls e maior número de unidades afetadas foi a Ford Motor Company com 67 recalls e 8.7 milhões de unidades afetadas. Este valor representa cerca de 28% do número de unidades afetadas por recalls em 2022.
Aproxidamente 33% dessas unidades correspondem a apenas um único recall, que afetou o componente Powertrain de 30 modelos de veículos da Ford Motor Company. Este recall foi o que mais afetou unidades de veículos em 2022, com aproximadamente 2.9 milhões de unidades.
Code
reported_recalls_and_affected_units = df_2022[['RECALL_ID', 'REPORTED_DATE', 'AFFECTED_UNITS']].drop_duplicates()fig = px.violin( reported_recalls_and_affected_units, y='AFFECTED_UNITS', labels={'AFFECTED_UNITS': 'Vehicle units'}, color_discrete_sequence=px.colors.qualitative.T10, title='Number of affected vehicle units distribution')fig.update_layout(yaxis_title=None, xaxis_title=None)fig.show()
Figure 2: Number of affected vehicle units ditribution
A Mercedes Benz foi a fabricante com mais modelos de veículos que passaram por recall, foram 340 modelos em 2022. Aproximadamente 40% destes modelos, produzidos entre 2017 até 2022, foram afetados por apenas um único recall que ocorreu nos componentes de comunicação e sistema elétrico.
Code
selected_columns = ['RECALL_ID', 'MANUFACTURER', 'REPORTED_DATE','VEHICLE_MODEL', 'VEHICLE_YEAR', 'AFFECTED_UNITS']recalls = df_2022[selected_columns].drop_duplicates()recalls_distribution = recalls.groupby( ['RECALL_ID', 'MANUFACTURER', 'AFFECTED_UNITS', 'REPORTED_DATE']).count().reset_index()fig = px.scatter( recalls_distribution, y='VEHICLE_MODEL', x='AFFECTED_UNITS', hover_name='RECALL_ID', hover_data=['MANUFACTURER', 'REPORTED_DATE'], color_discrete_sequence=px.colors.qualitative.T10, labels={'VEHICLE_MODEL': 'Recalled vehicles','AFFECTED_UNITS': 'Vehicle units','MANUFACTURER': 'Manufacturer','REPORTED_DATE': 'Reported Date'}, title='Recalls distribution by number of affected units and vehicles recalled')fig.show()
Figure 3: Recalls distribution by number of affected units and vehicles recalled
No ano de 2022, em média apenas uma recall foi reportada por veículo. Porém, existem vários outliers. Alguns exemplos:
IC Bus CE, modelo de 2023, com 10 recalls reportadas;
Tesla Model X, modelo de 2021 e 2022, com 10 recalls reportadas cada.
A mediana do número de unidades de veículos afetados por recalls em 2022 é de 459 unidades, mas existem vários outliers. Agrupando por modelo de veículo, vários modelos ultrapassam 3 milhões de unidades, tais como:
OBS: não é possível distinguir o número de unidades para cada modelo de veículo individualmente, apenas por recall. Portanto, este valor não representa o número exato de unidades de um determinado modelo de veículo, mas o número de unidades de veículos que foram afetados por recalls que incluem um determinado modelo.
Figure 4: Number of recalls and affected units by vehicle
Análisando os componentes que passaram por recalls e comparando o número de recalls com o número de unidades afetadas, observa-se que alguns componentes apesar de possuirem um número de recalls alto, possuem um número baixo de unidades afetadas se comparado com os demais componentes.
As recalls do componente acessório / equipamento correspondem a aproximadamente 21% do número de recalls do ano de 2022, porém o número de unidades afetadas corresponde a 2% do número total de unidades afetadas. O inverso ocorre com o componente Powertrain, com 5% do número de recalls, mas 15% do número total de unidades afetadas.
Isso pode ter ocorrido devido aos recalls de equipamento não serem tão críticos e não demandarem uma urgência, por parte do proprietário, no reparo ou troca do veículo ou por serem recalls que afetam apenas um pequeno conjunto de veículos.
Figure 5: Number of recalls and affected vehicle units by component
Esses indicadores auxiliam na tomada de decisão do fabricante para onde direcionar os esforços na melhoria de qualidade de seus processos internos, afim de reduzir o número de recalls e de unidades de veículos afetados.
Code
# TODO (sugestões por ordem de prioridade)# 1. Validar: O dashboard está exibindo informações corretas?# 2. Criar uma seção de Análise explanatória neste notebook:# O dashboard foi desenvolvido focando na relação entre número de recalls x número de veículos afetados.# Quais insights podem ser criados a partir do dashboard ? Podemos focar em um ano específico e extrair insights dele. Ex: No período x, apesar de existir um número grande de recalls de componente a, o número de unidades de veículos que foram afetadas é baixo se comparado com o número de recalls de componente b.# A análise explanatória poderia conter imagens geradas do dashboard. (Opção de download de imagem do plotly)# 4. Validar gráficos do dashboard. Verificar se os dados batem com a NHTSA.# Podemos utilizar a seguinte url para validar: https://www.nhtsa.gov/recalls?nhtsaId={recall_id}# 5. Gerar um pdf deste notebook.